package com.wangdong.mijiqiqi.threetype.presenter;

import android.content.Context;
import android.telecom.Call;


import com.wangdong.mijiqiqi.threetype.ApiBase;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;




/**
 * Created by chenmeng on 2016/6/22.
 * 处理网络
 */
public abstract class BaseNetPresenter<T> implements StateContract.StatePresenter{

    private StateContract.StateView mView;//处理加载网络,显示不显的
    private Context mContext;//上下文
    private StateListener<T> mListener;
    private String url;
    private Object object;
    private Class<?> cls;
//    private Gson mGson;
    public BaseNetPresenter(Context mContext, StateContract.StateView mView) {
        this.mContext = mContext;
        this.mView = mView;
        mView.setPresenter(this);
    }

    protected void updateData(StateListener<T> mListener, String url, Object object, Class<?> cls) {
        this.mListener = mListener;
        this.url=url;
        this.object=object;
        this.cls=cls;
        updateData();
    }

    @Override
    public void updateData(){
        if(mView==null||mListener==null)
            throw new NullPointerException("请先调用有参的updateData");
//        if (NetUtil.checkNet(mContext)) {
//            mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_START);
//            mListener.setParams(mView);
//            try {
//
//
//                OkHttpUtils
//                        .get().url(url)
//
//                        .params(objToHash(object))
//                        .build()
//                        .execute(new StringCallback() {
//                            @Override
//                            public void onError(Call call, Exception e, int id) {
//                                mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_NETWORK_ERROR);
//
//                            }
//
//                            @Override
//                            public void onResponse(String response, int id) {
//                                try {
//                                    if (mGson == null) {
//                                        mGson = new Gson();
//                                    }
//                                   ApiBase<T> baApiBase = (ApiBase<T>) mGson.fromJson(response, cls);
//                                    if (baApiBase == null) {
//                                        mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_NETWORK_ERROR);
//                                        mListener.onError("result of json parse is null");
//
//                                        return;
//                                    } else if (baApiBase.getError_code() == 0) {
//                                        mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_FINISH);
//                                        mListener.finishUpdate(baApiBase.getResult());
//
//                                    } else {
//                                        mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_NETWORK_ERROR);
//                                        mListener.onError(baApiBase.getReason()+"");
//                                        return;
//                                    }
//
//
//                                } catch (JsonSyntaxException e) {
//                                    e.printStackTrace();
//                                }
//
//                            }
//                        });






//
//				HttpSender.getInstance(mContext).get(url,cls,object, new CMJsonCallback<T>() {
//
//					@Override
//					public void onSuccess(T t) {
//						mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_FINISH);
//						mListener.finishUpdate(t);
//					}
//
//					@Override
//					public void onError(int code, String message) {
//						mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_NETWORK_ERROR);
//						mListener.onError(message);
//					}
//
//					@Override
//					public void onFail(int code, String message) {
//						mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_NETWORK_ERROR);
//						mListener.onError(message);
//					}
//				});




//			} catch (Exception e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//        } else {
//            mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_NETWORK_ERROR);
//            mListener.onError("网络异常");
//        }
    }

    @SuppressWarnings("rawtypes")
    public HashMap<String, String> objToHash(Object obj) {

        LinkedHashMap<String, String> hashMap = new LinkedHashMap<String, String>();
        try {
            Class clazz = obj.getClass();
            List<Class> clazzs = new ArrayList<Class>();

            do {
                clazzs.add(clazz);
                clazz = clazz.getSuperclass();
            } while (!clazz.equals(Object.class));

            for (Class iClazz : clazzs) {
                Field[] fields = iClazz.getDeclaredFields();
                for (Field field : fields) {
                    String objVal = null;
                    field.setAccessible(true);
                    if(field.get(obj)!=null){
                        objVal = String.valueOf(field.get(obj));
//                        if(!StringUtils.isEmpty(objVal)){
//                            hashMap.put(field.getName(), objVal);
//                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return hashMap;
    }
    public static abstract class StateListener<T> implements BaseMvpModel.UpdateListener<T>{
        private StateContract.StateView mView;

        public void loadingFinish() {
            mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_FINISH);
        }

        @Override
        public void finishUpdate(T result) {
            mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_FINISH);
        }

        public void setParams(StateContract.StateView mView) {
            this.mView = mView;
        }

        @Override
        public void onError(String msg) {
            if(mView!=null) {
                mView.showLoadStatus(BaseNetView.NetworkLoadStatus.LOAD_FAIL);
            }
        }
    }
}
